'''
    1.实现注册和登录模块的接口测试用例
'''
from time import sleep

import requests
import unittest

from parameterized import parameterized

import utils
from api.api_reg_login import RegLoginApi


class TestRegLogin(unittest.TestCase):

    # 数据初始化
    @classmethod
    def setUpClass(cls) -> None:
        utils.clear_user_info()

    def setUp(self) -> None:
        # 1.创建session对象
        self.session = requests.session()
        # 2.实例化封装的注册登录的类
        self.reg_login = RegLoginApi(self.session)

    def tearDown(self) -> None:
        # 关闭session对象
        self.session.close()

    # 获取图片验证码测试用例
    @parameterized.expand(utils.read_json("reg_login_data", "img_verify_code"))
    def test01_img_verify_code(self, r, exp_status_code):
        # 3.调用封装的获取图片验证码接口的方法
        res = self.reg_login.get_img_verify_code(r)

        # 4.断言
        # 断言状态码
        self.assertEqual(exp_status_code, res.status_code)

    # 获取短信验证码测试用例
    @parameterized.expand(utils.read_json("reg_login_data", "phone_verify_code"))
    def test02_phone_verify_code(self, phone, imgVerifyCode, exp_stauts_code, exp_status, exp_desp):
        # 图片验证码接口
        self.reg_login.get_img_verify_code()
        # 短信验证码接口
        res = self.reg_login.get_phone_verify_code(phone, imgVerifyCode)
        print(res.json())
        # 断言--调用公共断言方法
        utils.common_assert(self, res, exp_stauts_code, exp_status, exp_desp)

    # 注册测试用例
    @parameterized.expand(utils.read_json("reg_login_data", "user_register"))
    def test03_register(self, phone, password, veriyfcode, phonecode, dy_server, invite_phone, exp_stauts_code,
                        exp_status, exp_desp):
        # 图片验证码接口
        self.reg_login.get_img_verify_code()
        # 短信验证码接口
        self.reg_login.get_phone_verify_code(phone)
        # 注册接口
        res = self.reg_login.user_register(phone, password, veriyfcode, phonecode, dy_server, invite_phone)
        print(res.json())
        # 断言--调用公共断言方法
        utils.common_assert(self, res, exp_stauts_code, exp_status, exp_desp)

    # 登录测试用例
    @parameterized.expand(utils.read_json("reg_login_data", "user_login"))
    def test04_user_login(self, keywords, password, exp_stauts_code,
                          exp_status, exp_desp):
        # 登录接口
        res = self.reg_login.user_login(keywords, password)

        # 断言--调用公共断言方法
        utils.common_assert(self, res, exp_stauts_code, exp_status, exp_desp)

    # 登录测试用例-密码错误校验
    @unittest.skip
    def test05_user_login_check_error(self):
        # 第一次登录失败
        # 登录接口
        res_1 = self.reg_login.user_login("18800011121", "qqq")
        # 断言--调用公共断言方法
        utils.common_assert(self, res_1, 200, 100, "密码错误1次,达到3次将锁定账户")
        # 第二次登录失败
        # 登录接口
        res_2 = self.reg_login.user_login("18800011121", "qqq")
        # 断言--调用公共断言方法
        utils.common_assert(self, res_2, 200, 100, "密码错误2次,达到3次将锁定账户")

        # 第三次登录失败
        # 登录接口
        res_3 = self.reg_login.user_login("18800011121", "qqq")
        # 断言--调用公共断言方法
        utils.common_assert(self, res_3, 200, 100, "由于连续输入错误密码达到上限，账号已被锁定，请于1.0分钟后重新登录")

        # 等待一分钟
        sleep(60)

        # 登录接口
        res_4 = self.reg_login.user_login("18800011121", "123qqq")
        # 断言--调用公共断言方法
        utils.common_assert(self, res_4, 200, 200, "登录成功")

    # 查询登录状态测试用例
    @parameterized.expand(utils.read_json("reg_login_data", "query_user_login"))
    def test06_user_login_status(self, login_status, exp_stauts_code, exp_status, exp_desp):
        if login_status == "已登录":
            # 登录
            self.reg_login.user_login("18800011121", "123qqq")
            # 查询登录状态
            res = self.reg_login.query_user_login_status()
            # 断言
            utils.common_assert(self, res, exp_stauts_code, exp_status, exp_desp)

        elif login_status == "未登录":
            # 查询登录状态
            # 查询登录状态
            res = self.reg_login.query_user_login_status()
            # 断言
            utils.common_assert(self, res, exp_stauts_code, exp_status, exp_desp)
